/*
    共采购了10台小车，此文件分别完成10台小车的信息录入，并完成编号。
*/

#include "../include/car.h"
#include <iostream>
#include <random>
#include <ctime>
// #include <vector>

const int carCount = 10; // 小车数目
// 除了编号需要自定义之外，其他信息都是给出写死的。
// 标准底盘
const BasePlate basePlate = {
    "undefined", //
    "SCOUT MINI",
    451,
    490,
    115,
    0,
    "四轮四驱",
    10,
    {{"公路轮", 175},
     {"公路轮", 175},
     {"麦克纳姆轮", 175},
     {"麦克纳姆轮", 175}}};

const AGX agx = {
    "AGX Xavier",
    32,
    512,
    64,
    32,
    32};

const BinocularCamera binocularCamera = {
    "RealSense D435i",
    "D430",
    1920, 1080,
    30, 87, 58, 90};

const Ladar ladar = {
    "RS-Helios-16p", 16, 100, 8};

const Gyroscope gyroscope = {
    "CH110",
    "NXP"};

const LCD lcd = {
    11.6,
    "super"};

const Battery battery = {
    "24V/15Ah",
    24,
    2};

// 生成一个自定义的cqusn打头的16位数字+字母的小车编号
std::string generateCarID(int num) {
    // 简单起见，直接前面部分自定义，后面跟着一个序号

    // 前14位
    std::string result = "cqusnE20200340";

    // 后2位
    if (num < 10) {
        result += "0";
    }
    result += std::to_string(num);

    return result;
}

// 移到外面（在函数体里面，则剩余的随机字符串相同）
std::mt19937 gen((unsigned int)time(NULL));
// 生成底盘的ID。也尝试一下运用随机数生成不同的ID
std::string generateDpID(int num) {
    const std::string characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const int length = 8;

    // 关于random的一些用法，参考了 https://blog.csdn.net/Alfa_/article/details/125215799
    std::random_device rd;  // 随机数发生器
    // std::mt19937 gen(rd()); // 随机数引擎
    std::uniform_int_distribution<int> distribution(0, characters.length() - 1);

    std::string result = "dp";  
    // 将输入的num转换为字符串，并拼接到结果中，确保id肯定不一样
    if (num < 10) {
        result += "0";
    }
    result += std::to_string(num);

    // 生成剩余的随机字符
    for (int i = 0; i < length - 4; i++) {
        result += characters[distribution(gen)];
    }

    return result;
}

std::vector<CAR> car_init()
{
    // CAR car[carCount]; // 智能小车
    std::vector<CAR>car(carCount);
    for (int i = 0; i < carCount; i++)
    {
        car[i] = {"undefined", basePlate,agx,binocularCamera,ladar,gyroscope,lcd,battery};
        // 自定义小车编号
        car[i].id = generateCarID(i);
        // 底盘编号
        car[i].basePlate.id = generateDpID(i);
    }
    return car;
}